﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using Doves.Utilities;

namespace Doves.DataAccessLayer.DAO
{
    public class LinkDAO : ILink
    {
        private static DoveNewsEntities dataContext;
        private IRepository<Link> repository;
        public LinkDAO()
        {
            dataContext = new DoveNewsEntities();
            repository = new RepositoryDAO<Link>(dataContext);
        }

        public IEnumerable<Link> GetAllLink()
        {
            return repository.GetAll();
        }

        public Link GetLinkById(int Id)
        {
            return repository.Find(obj => obj.Id == Id).Single();
        }

        public bool UpdateLink(Link inLink)
        {
            if (inLink == null) return false;
            Link upLink = repository.First(sobj => sobj.Id == inLink.Id);
            if (upLink == null) return false;
            upLink = inLink;
            return repository.SaveChanges() > 0;
        }
        public bool InsertLink(Link inLink)
        {
            if (inLink == null) return false;
            repository.Add(inLink);
            return repository.SaveChanges() > 0;
        }

        /// <summary>
        /// Check URL of Link exists or not
        /// </summary>
        /// <param name="inLink"></param>
        /// <returns></returns>
        public bool IsExists( Link inLink)
        {
            if (dataContext.Links.Any(o => o.Url == inLink.Url))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public ReturnValue<bool> DelLink(int Id)
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            try
            {
                Link objDel = repository.First(obj => obj.Id == Id);
                ret = DelLink(objDel);
            }
            catch (Exception ex)
            {
                ret.RetValue = false;
                ret.Msg = "Dữ liệu đã được sử dung trong chương trình - không thể xóa !";
            }
            return ret;
        }


        public ReturnValue<bool> DelLink(Link inLink)
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            if (inLink == null)
            {
                ret.Msg = "Input null";
                return ret;
            }
            try
            {
                repository.Delete(inLink);
                ret.RetValue = repository.SaveChanges() > 0;
            }
            catch (System.Exception ex)
            {
                ret.RetValue = false;
                ret.Msg = "Dữ liệu đã được sử dung trong chương trình - không thể xóa !";
            }
            return ret;
        }

        public ReturnValue<bool> IsHaveLinkNeedCrawle()
        {
            ReturnValue<bool> ret = new ReturnValue<bool>(false, "");
            if (dataContext.Links.Any(o => o.IsCrawled == false 
                && o.RetryTimes <= Utilities.Constants.NUM_RETRY_CRAWLE_ARTICLE))
            {
                ret.RetValue = true;
            }
            return ret;
        }

        public IEnumerable<Link> GetLinkToCrawle(int inNumOfRecord = Utilities.Constants.NUM_LINK_EACH_QUERY)
        {
            return dataContext.Links.Where(o => o.IsCrawled == false 
                && o.RetryTimes <= Utilities.Constants.NUM_RETRY_CRAWLE_ARTICLE)
                .Take(inNumOfRecord);
        }

    }
}
